1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <cstdio> #include <algorithm> const int maxn = 1e5 + 5; using namespace std; struct QNode{ int t, a, res, id; bool operator< (QNode x)const{ return t < x.t || (t == x.t && a < x.a); } }q[maxn]; int X, n, Q, r[maxn], opt = -1; bool cmpid(QNode x, QNode y){ return x.id < y.id; } int main(){ scanf("%d%d", &X, &n); for (int i = 1; i <= n; i++) scanf("%d", r + i); scanf("%d", &Q); for (int i = 1; i <= Q; i++) scanf("%d%d", &q[i].t, &q[i].a), q[i].id = i; sort(q + 1, q + Q + 1); int lr = 0, lq = 1, u = X, d = 0, S = 0; while (lq <= Q){ if (r[lr + 1] < q[lq].t && lr < n){ ++lr; int t = opt * (r[lr] - r[lr - 1]); d = max(0, min(X, d + t)); u = max(0, min(X, u + t)); S += t; opt *= -1; } else{ q[lq].res = max(d, min(u, S + q[lq].a)); q[lq].res = min(X, max(0, q[lq].res + opt * (q[lq].t - r[lr]))); ++lq; } } sort(q + 1, q + Q + 1, cmpid); for (int i = 1; i <= Q; i++) printf("%d\n", q[i].res); return 0; }
|